package elicecn.netpay;

import java.io.Serializable;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import elicecn.util.StringUtils;
import elicecn.util.encrypt.Encrypt;
import elicecn.util.encrypt.EncryptBase;

/**
 * 建设银行网银参数
 * 
 * @author 屹砾
 * @email eli.wuhan@gmail.com
 * @time 2009-8-7
 */
public class CCBParam implements Serializable {
	private static final long serialVersionUID = 782518878402953472L;
	protected static final Log log = LogFactory.getLog(CCBParam.class);
	private static final Encrypt md5 = EncryptBase.getMD5Algorithm();
	public static final String CURCODE_RMB = "01";
	public static final String CCB_URL = "https://ibsbjstar.ccb.com.cn/app/ccbMain?";

	private String merchantId;// 商户代码
	private String posId;// 商户柜台代码
	private String branchId;// 分行代码
	private String orderId;// 定单号
	private String payment;// 付款金额
	private String curCode;// 币种
	private String remark1;// 备注1
	private String remark2;// 备注2
	private String txCode;// 交易码
	private String mac;// MD5校验

	/**
	 * CCB网银构造方法
	 * 
	 * @param merchantId
	 *            商户代码(客户号) CHAR(21) 由建行统一分配
	 * @param posId
	 *            商户柜台代码 CHAR(9) 由建行统一分配
	 * @param branchId
	 *            分行代码 CHAR(9) 由建行统一指定
	 * @param orderId
	 *            定单号 CHAR(30) 由商户提供，最长30位,按实际长度给出
	 * @param payment
	 *            付款金额 NUMBER(16,2) 由商户提供，按实际金额给出
	 * @param curCode
	 *            币种 CHAR(2) 缺省为01－人民币
	 * @param remark1
	 *            备注1 CHAR(30) 网银不处理，直接传到城综网
	 * @param remark2
	 *            备注2 CHAR(30) 网银不处理，直接传到城综网
	 * @param txCode
	 *            交易码 CHAR(6) 由建行统一分配
	 */
	public CCBParam(String merchantId, String posId, String branchId,
			String orderId, String payment, String curCode, String remark1,
			String remark2, String txCode) {
		this.merchantId = merchantId;
		this.posId = posId;
		this.branchId = branchId;
		this.orderId = orderId;
		this.payment = payment;
		this.curCode = curCode;
		this.remark1 = remark1;
		this.remark2 = remark2;
		this.txCode = txCode;
	}

	/**
	 * CCB网银构造方法，默认货币为人民币
	 * 
	 * @param merchantId
	 *            商户代码(客户号) CHAR(21) 由建行统一分配
	 * @param posId
	 *            商户柜台代码 CHAR(9) 由建行统一分配
	 * @param branchId
	 *            分行代码 CHAR(9) 由建行统一指定
	 * @param orderId
	 *            定单号 CHAR(30) 由商户提供
	 * @param payment
	 *            付款金额 NUMBER(16,2) 由商户提供
	 * @param txCode
	 *            交易码 CHAR(6) 由建行统一分配
	 */
	public CCBParam(String merchantId, String posId, String branchId,
			String orderId, String payment, String txCode) {
		this.merchantId = merchantId;
		this.posId = posId;
		this.branchId = branchId;
		this.orderId = orderId;
		this.payment = payment;
		this.curCode = CURCODE_RMB;
		this.txCode = txCode;
	}

	/**
	 * 创建到银行支付页面的URL
	 * 
	 * @return
	 */
	public String createUrl() {
		StringBuffer buf = new StringBuffer();
		buf.append("MERCHANTID=")
				.append(StringUtils.acquireNotNull(merchantId));
		buf.append("&POSID=").append(StringUtils.acquireNotNull(posId));
		buf.append("&BRANCHID=").append(StringUtils.acquireNotNull(branchId));
		buf.append("&ORDERID=").append(StringUtils.acquireNotNull(orderId));
		buf.append("&PAYMENT=").append(StringUtils.acquireNotNull(payment));
		buf.append("&CURCODE=").append(StringUtils.acquireNotNull(curCode));
		buf.append("&TXCODE=").append(StringUtils.acquireNotNull(txCode));
		buf.append("&REMARK1=").append(StringUtils.acquireNotNull(remark1));
		buf.append("&REMARK2=").append(StringUtils.acquireNotNull(remark2));
		mac = md5.calc(buf.toString());
		buf.append("&MAC=").append(mac);
		return buf.insert(0, CCB_URL).toString();
	}

	public static void main(String[] args) {
		CCBParam ccb = new CCBParam("1000", "1000", "1000", "1000", "1000",
				"1000");
		log.info(ccb.createUrl());
	}
}
